"""
云端存储数据模型

本文件定义了与云端存储服务交互所需的数据模型，主要用于：
1. 将平板端接收的脑波数据转换为云端存储服务要求的格式
2. 处理云端存储服务的响应数据
3. 提供数据验证和类型安全
4. 支持带时间戳和序列号的有序数据传输

主要模型：
- CloudStorageEEGData: 云端存储的主要数据结构（新格式）
- WaveData: 波形数据容器，支持有序frames数组
- FrequencyBandData: 频段数据结构
- CloudStorageResponse: 云端服务响应模型
- TabletRawData: 平板端原始数据模型

数据转换原理：
平板端提供带时间戳的raw_value数据，本模块将其封装成云端存储服务
要求的格式，包括原始脑波数据和8个频段的数据。通过时间戳排序确保数据有序，
使用序列号防止数据包乱序，添加数据包时间信息支持长时间数据流处理。
"""

from typing import List, Optional
from pydantic import BaseModel, Field, validator


class WaveFrames(BaseModel):
    """波形帧数据模型 - 有序的数据帧数组"""
    frames: List[float] = Field(..., description="按时间戳排序的波形数据帧数组")
    
    @validator('frames')
    def validate_frames_not_empty(cls, v):
        """验证frames不为空"""
        if not v:
            raise ValueError('frames数组不能为空')
        return v


class WaveData(BaseModel):
    """波形数据模型，包含原始和过滤后的数据"""
    frame_rate: int = Field(..., description="帧率（Hz）")
    wave: WaveFrames = Field(..., description="原始波形数据")
    filtered: WaveFrames = Field(..., description="过滤后波形数据")


class FrequencyBandData(BaseModel):
    """频段数据模型"""
    frame_rate: int = Field(..., description="帧率（Hz）")
    wave: WaveFrames = Field(..., description="原始频段数据")
    filtered: WaveFrames = Field(..., description="过滤后频段数据")


class CloudStorageEEGData(BaseModel):
    """
    云端存储EEG数据模型 - 新格式，支持时间戳和序列号
    
    对应用户提供的存储端数据格式，包含：
    - 数据包时间信息（data_timestamp, duration_seconds, sequence_number）
    - 有序的波形数据（通过时间戳排序的frames数组）
    - 8个频段的原始和过滤数据
    """
    
    # 基础信息
    id: str = Field(..., description="会话ID")
    room_id: str = Field(..., description="房间ID")
    
    # 新增：数据包时间信息
    data_timestamp: float = Field(..., description="数据采集开始时间戳（Unix时间戳）")
    duration_seconds: float = Field(..., description="数据包时长（秒）")
    sequence_number: int = Field(..., description="数据包序号（用于排序）")
    
    # 原始脑波数据
    eeg_wave_data: WaveData = Field(..., description="EEG波形数据")
    
    # 8个频段数据
    delta_data: FrequencyBandData = Field(..., description="Delta波段数据")
    theta_data: FrequencyBandData = Field(..., description="Theta波段数据")
    low_alpha_data: FrequencyBandData = Field(..., description="低Alpha波段数据")
    high_alpha_data: FrequencyBandData = Field(..., description="高Alpha波段数据")
    low_beta_data: FrequencyBandData = Field(..., description="低Beta波段数据")
    high_beta_data: FrequencyBandData = Field(..., description="高Beta波段数据")
    low_gamma_data: FrequencyBandData = Field(..., description="低Gamma波段数据")
    mid_gamma_data: FrequencyBandData = Field(..., description="中Gamma波段数据")
    
    @validator('duration_seconds')
    def validate_duration(cls, v):
        """验证数据包时长合理性"""
        if v <= 0 or v > 3600:  # 最大1小时
            raise ValueError('数据包时长必须在0到3600秒之间')
        return v
    
    @validator('sequence_number')
    def validate_sequence_number(cls, v):
        """验证序列号"""
        if v < 0:
            raise ValueError('序列号不能为负数')
        return v


class CloudStorageResponse(BaseModel):
    """云端存储服务响应模型"""
    success: bool = Field(..., description="请求是否成功")
    message: str = Field(..., description="响应消息")
    data: Optional[dict] = Field(default=None, description="响应数据")


class RawValuePoint(BaseModel):
    """原始数据点模型（平板端格式）"""
    timestamp: int = Field(..., description="数据点时间戳")
    value: float = Field(..., description="数据点值")


class RealtimeDataPoint(BaseModel):
    """实时数据点模型 - 对应云端API接口格式"""
    timestamp: float = Field(..., description="数据时间戳")
    state: str = Field(..., description="用户状态")
    confidence: float = Field(..., description="状态置信度")
    delta: float = Field(..., description="Delta波段比例")
    theta: float = Field(..., description="Theta波段比例")
    alpha: float = Field(..., description="Alpha波段比例")
    beta: float = Field(..., description="Beta波段比例")
    gamma: float = Field(..., description="Gamma波段比例")


class RealtimeDataRequest(BaseModel):
    """实时数据请求模型"""
    session_id: str = Field(..., description="会话ID")
    room_id: str = Field(..., description="房间ID")
    user_id: str = Field(default="default_user", description="用户ID")
    data: List[RealtimeDataPoint] = Field(..., description="实时数据点列表，支持单个或多个时间戳")


class RealtimeDataResponse(BaseModel):
    """实时数据发送响应模型"""
    status: str = Field(..., description="响应状态")
    message: str = Field(..., description="响应消息")
    data: Optional[dict] = Field(default=None, description="响应数据，包含id和updated_at")


class TabletRawData(BaseModel):
    """平板端原始数据模型 - 对应平板端上传的数据格式"""
    
    # 基础信息
    session_id: int = Field(..., description="会话ID")
    room_id: str = Field(..., description="房间ID")
    
    # 原始数据点列表
    raw_data: List[RawValuePoint] = Field(..., description="原始数据点列表")
    
    # 频域数据（8个频段的功率值）
    delta: float = Field(..., description="Delta波段功率")
    theta: float = Field(..., description="Theta波段功率")
    low_alpha: float = Field(..., description="低Alpha波段功率")
    high_alpha: float = Field(..., description="高Alpha波段功率")
    low_beta: float = Field(..., description="低Beta波段功率")
    high_beta: float = Field(..., description="高Beta波段功率")
    low_gamma: float = Field(..., description="低Gamma波段功率")
    mid_gamma: float = Field(..., description="中Gamma波段功率")
    
    # 质量指标
    attention: int = Field(..., description="注意力指数")
    meditation: int = Field(..., description="冥想指数")
    signal_quality: int = Field(..., description="信号质量")
    blink_strength: int = Field(..., description="眨眼强度")